Android Handler 메커니즘 실현 원리 분석
먼저 위의 그림 에서 여러분 께 handler 메커니즘 을 잘 이해 하도록 하 겠 습 니 다.
handler 메커니즘 예제 도
위 에 모두 몇 가지 종류 가 나 타 났 습 니 다.Activity Thread,Handler,Message Queue,Looper,msg(Message)는 이런 종류 에 대해 간략하게 소개 합 니 다.
Activity Thread:프로그램의 시작 입 구 는 왜 이런 종 류 를 소개 합 니까?이 종 류 는 우리 가 말 하 는 메 인 스 레 드 이기 때문에 Looper 를 조작 합 니 다.
Handler:말 그대로 조작 자 라 는 뜻 입 니 다.이 종 류 는 비교적 중요 한 부분 이 있 습 니 다.handler 를 통 해 메시지(sendmessage)를 Message Queue 와 조작 컨트롤 의 업데이트(handleMessage)로 보 내 는 것 입 니 다.handler 아래 에는 이 Message Queue 와 Looper 의 대상 이 있 습 니 다.
Message Queue:메시지 큐 라 는 뜻 으로 Message 클래스 를 패키지 하 는 것 입 니 다.Message 를 삽입 하고 꺼 내 는 작업 을 합 니 다.
Message:이 종 류 는 메시지 체 를 패키지 하고 Message Queue 에 보 내 는 것 입 니 다.종 류 는 링크 를 통 해 이 루어 집 니 다.Message Queue 의 삽입 과 추출 작업 에 편리 합 니 다.그리고 일부 필드 는(int what,Object obj,int arg 1,int arg 2)입 니 다.what 는 수신 자(handler)가 이것 이 무엇 에 관 한 것 인지 알 수 있 도록 사용자 가 정의 한 메시지 와 코드 입 니 다.obj 는 임의의 대상 을 전송 하 는 데 사용 되 며,arg 1 과 arg 2 는 간단 한 정수 유형 을 전달 하 는 데 사용 된다.
다음 에 우 리 는 시작 순서에 따라 소스 코드 분석 을 한다.
위 에서 알 수 있 듯 이 Activity Thread 류 는 안 드 로 이 드 를 시작 하 는 데 사 용 됩 니 다.그 소스 코드 는 다음 과 같 습 니 다.
Activity Thread 클래스:
그 다음 에 우 리 는 Looper 류 를 보 았 다.우 리 는 들 어가 서 안의 소스 코드 가 실현 되 는 것 을 보 았 다.
우선,안에 어떤 필드 가 있 는 지 봅 시다.
Looper 의 내부 속성
그리고 우 리 는 prepareMain Looper 방법 을 보고 싶 어서 도대체 무엇 을 했 는 지 알 고 싶 었 다.
Looper.prepareMainLooper()방법
prepareMainLooper 는 메시지 큐 와 메시지 시퀀스 기 를 가 진 Looper 를 설정 하기 위해 ThreadLocal 에 들 어 가 는 것 을 볼 수 있 습 니 다.다음은 루프 방법 을 살 펴 보 자.
Looper.loop()방법
loop 방법 에서 내부 메시지 시퀀스 기 를 꺼 내 고 메시지 의 target 에 따라 메 시 지 를 전달 하 는 것 을 볼 수 있 습 니 다(handle Message 방법 으로).의문 이 있다 면 Looper 의 Message Queue 가 왜 Message 가 있 는 지 잘 모 를 것 입 니 다.그럼 우 리 는 바로 가서 도대체 어디 에 소식 을 추 가 했 는 지 보 자.그 나 저 나 여기까지 우리 handler 와 관련 된 조작 을 분석 하지 못 한 것 같 습 니 다.당신 과 나 는 handler 의 역할 이 sendmessage 와 handleMessage 라 는 것 을 알 고 있 기 때문에 우 리 는 Looper 의 메시지 시퀀스 의 메시지 체 는 sendmessage 에서 추 가 된 것 이 분명 하 다 는 것 을 알 고 있 습 니 다.잉크 자국 이 없 으 면 우 리 는 즉시 Handler 의 소스 코드 분석 에 들어간다.
우선,Handler 의 필드 를 살 펴 보 겠 습 니 다.
Handler 필드
이어서 우 리 는 Handler 의 구조 방법 을 살 펴 보 았 다.우 리 는 Handler 가 두 가지 구조 방법 이 있다 는 것 을 알 수 있다.
Handler 의 구조 방법
이어서 우 리 는 Handler.dispatchMessage()방법 에 들 어가 야 한다.왜냐하면 우 리 는 위 에서 방금 Looper.loop 방법 을 설명 해 야 하기 때문이다.dispatchMessage 의 방법 은 매우 간단 합 니 다.세 가지 방향 만 있 고 그 소스 코드 는 다음 과 같 습 니 다.
Handler.dispatchMessage()방법
여기까지 실행 코드 가 끝 났 습 니 다.그럼 문제 가 생 겼 어 요.소식 은 어디서 났 어 요?이 의문 을 가지 고 우 리 는 즉시 Handler.sendmessage()논리 에 들 어가 보 겠 습 니 다.그 소스 코드 는:
Handler.sendmessage()방법
어렵 게 메 시 지 를 보 내 는 논 리 를 찾 아 이 해 했 지만 껍질 을 벗 기 고 Message Queue 에서 분 석 했 습 니 다.우선 메시지 시퀀스 기 는 Looper.prepare()에서 초기 화 되 었 습 니 다.Message Queue 소스 코드,구조 방법 은 간단 합 니 다.
Message Queue 구조 방법
그리고 우 리 는 Message Queue.enqueueMessage()방법 에 도착 해서 원본 코드 를 봅 니 다.
Message Queue.enqueueMessage()방법
이것 은 메 시 지 를 보 내 는 최종 실행 코드 로 메 시 지 를 메시지 시퀀스 에 넣 는 것 이다.Looper.loop()방법 에서 우 리 는 메시지 시퀀스 에서 메 시 지 를 계속 꺼 내야 합 니 다.그 과정 도 Message Queue.next()의 소스 코드 에 들 어가 볼 수 있 습 니 다.
Message Queue.next()방법
이렇게 하면 전체 과정 이 완성 된다.이러한 실행 과정 에서 Message 는 그들의 물건 이다.우 리 는 Message 의 구 조 를 볼 수 있다.
Message 필드
그 밖 에 Message 의 데이터 구 조 는 링크 를 바탕 으로 하 는 것 이 고 방법 이 간단 해서 붙 이지 않 겠 습 니 다.
요약 하면 사실은 하나의 ThreadLocal 로 대상 을 저장 한 다음 에 실행 할 때 대상 의 변형 을 확보 할 수 있 습 니 다.그러면 메 인 라인 에서 UI 를 업데이트 할 수 있 습 니 다.
이상 은 안 드 로 이 드 핸들 러 에 대한 상세 한 설명 입 니 다.추 후 관련 자 료 를 계속 정리 하 겠 습 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.